/**
 * Language Handler Architecture
 * 通用语言处理器架构
 * 支持不同框架和语言的特殊对象处理
 */

(function () {
    'use strict';

    // 导出到全局作用域
    window.LanguageHandlers = {
        
        // 注册的语言处理器
        handlers: new Map(),
        
        // 默认处理器
        defaultHandler: {
            name: 'default',
            isSpecialObject: () => false,
            extractValue: (obj, depth, visited, utils) => obj,
            shouldFilter: () => false
        },

        /**
         * 注册语言处理器
         * @param {string} name - 处理器名称
         * @param {Object} handler - 处理器对象
         */
        register(name, handler) {
            this.handlers.set(name, handler);
        },

        /**
         * 获取语言处理器
         * @param {string} name - 处理器名称
         * @returns {Object} 处理器对象
         */
        getHandler(name) {
            return this.handlers.get(name) || this.defaultHandler;
        },

        /**
         * 处理特殊对象
         * @param {*} obj - 要处理的对象
         * @param {number} depth - 当前深度
         * @param {WeakSet} visited - 已访问的对象集合
         * @param {Object} utils - 工具函数集合
         * @returns {*} 处理后的对象
         */
        processSpecialObject(obj, depth, visited, utils) {
            // 遍历所有注册的处理器
            for (const [name, handler] of this.handlers) {
                try {
                    if (handler.isSpecialObject(obj)) {
                        if (handler.shouldFilter(obj)) {
                            return handler.getFilterMessage ? handler.getFilterMessage(obj) : `[${name} Object]`;
                        }
                        return handler.extractValue(obj, depth, visited, utils);
                    }
                } catch (e) {
                    console.warn(`Language handler ${name} error:`, e.message);
                }
            }
            return obj;
        },

        /**
         * 检查对象是否应该被过滤
         * @param {*} obj - 要检查的对象
         * @returns {boolean} 是否应该被过滤
         */
        shouldFilterObject(obj) {
            for (const [name, handler] of this.handlers) {
                try {
                    if (handler.isSpecialObject(obj) && handler.shouldFilter(obj)) {
                        return true;
                    }
                } catch (e) {
                    console.warn(`Language handler ${name} error:`, e.message);
                }
            }
            return false;
        }
    };

})();
